package com.baike.controller;


import com.baike.data.Result;
import com.baike.em.ConstantEnum;
import com.baike.entity.TbLessonLabel;
import com.baike.service.impl.TbLessonLabelServiceImpl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.api.R;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.sql.Array;
import java.util.*;
import java.util.stream.Collectors;

/**
 * <p>
 *  前端控制器
 * </p>
 *
 * @author lbs
 * @since 2021-10-29
 */
@RestController
@RequestMapping("lessonLabelController")
@Api("课程标签管理数据管理")
public class TbLessonLabelController {

    @Autowired
    private TbLessonLabelServiceImpl labelService;

    @PutMapping("/putLessonLabel")
    @ApiOperation("课程标签关联修改 将原有的删除 根据数据重新添加")
    @ApiImplicitParams({
            @ApiImplicitParam(value = "课程id", name = "lessonId", required = true, paramType = "query"),
            @ApiImplicitParam(value = "标签id字符串 英文 , 分隔", name = "labelIdStr", required = true, paramType = "query")
    })
    public Result<ConstantEnum> putLessonLabel(@RequestParam("lessonId")Long lessonId,@RequestParam("labelIdStr")String labelIdStr){
        //根据传来的 课程id 和 标签id 字符串进行 关联表数据添加
        // 如果数据不为空 进行操作
        if(Objects.nonNull(lessonId) && StringUtils.isNotEmpty(labelIdStr)){
            //先将课程原有的标签删除
            LambdaQueryWrapper<TbLessonLabel> wrapper = Wrappers.<TbLessonLabel>lambdaQuery().eq(TbLessonLabel::getLessonId, lessonId);
            labelService.remove(wrapper);

            // 如果标签id 是一个
            if(!labelIdStr.contains(",")){
                //添加单条数据
                boolean b = labelService.save(new TbLessonLabel(lessonId, Integer.parseInt(labelIdStr)));
                if(b){
                    return Result.build(ConstantEnum.SUCCESS);
                }
                return Result.build(ConstantEnum.ERROR);
            }else {
                // 添加多条数据
                // 标签id 分割成 string[] 转 int[]
                int[] labelIds = Arrays.stream(labelIdStr.split(",")).mapToInt(Integer::parseInt).toArray();
                // 标签id 集合
                List<Integer> labelIdList = Arrays.stream(labelIds).boxed().collect(Collectors.toList());
                // 创建课程标签管理实体类集合
                List<TbLessonLabel> labelList = new ArrayList<>();
                // 循环课程id集合 生成 管理实体类 加入 是实体类集合
                labelIdList.forEach(labelId -> labelList.add(new TbLessonLabel(lessonId,labelId)));
                //调用service 加入到数据库
                boolean b = labelService.saveBatch(labelList);
                if(b){
                    return Result.build(ConstantEnum.SUCCESS);
                }
                return Result.build(ConstantEnum.ERROR);
            }
        }

        //返回参数为空
        return Result.build(ConstantEnum.NULL_DATA_PARAMETER);
    }

    @DeleteMapping("byLabelStr")
    @ApiOperation("根据标签id字符串删除关联表信息")
    @ApiImplicitParam(value = "标签id字符串 英文 , 分隔", name = "labelIdStr", required = true, paramType = "query")
    public Result<ConstantEnum> delLessonLabelByLabelStr(@RequestParam("labelIdStr")String labelIdStr){
        //根据传来的 课程id 和 标签id 字符串进行 关联表数据添加
        // 如果数据不为空 进行操作
        if(StringUtils.isNotEmpty(labelIdStr)){
            if(!labelIdStr.contains(",")){
                // 删除 课程id 标签 id 相等的 数据
                LambdaQueryWrapper<TbLessonLabel> wrapper = Wrappers.<TbLessonLabel>lambdaQuery().eq(TbLessonLabel::getLabelId,Integer.parseInt(labelIdStr));
                boolean b = labelService.remove(wrapper);
                if(b){
                    return Result.build(ConstantEnum.SUCCESS);
                }
                return Result.build(ConstantEnum.ERROR);
            }else {
                // 删除多条数据
                // 标签id 分割成 string[] 转 int[]
                int[] labelIds = Arrays.stream(labelIdStr.split(",")).mapToInt(Integer::parseInt).toArray();
                List<Integer> labelIdList = Arrays.stream(labelIds).boxed().collect(Collectors.toList());
                LambdaQueryWrapper<TbLessonLabel> wrapper = Wrappers.<TbLessonLabel>lambdaQuery().in(TbLessonLabel::getLabelId, labelIdList);
                boolean b = labelService.remove(wrapper);
                if(b){
                    return Result.build(ConstantEnum.SUCCESS);
                }
                return Result.build(ConstantEnum.ERROR);
            }

        }
        // 返回参数为空
        return Result.build(ConstantEnum.NULL_DATA_PARAMETER);
    }

    @DeleteMapping("byLessonId")
    @ApiOperation("根据课程id删除关联表信息")
    @ApiImplicitParam(value = "课程id 英文 , 分隔", name = "LessonId", required = true, paramType = "query")
    public Result<ConstantEnum> delLessonLabelByLessonId(@RequestParam("LessonId")Long[] LessonId){
        if(Objects.nonNull(LessonId)){
            LambdaQueryWrapper<TbLessonLabel> wrapper = Wrappers.<TbLessonLabel>lambdaQuery().in(TbLessonLabel::getLessonId,Arrays.<Long>asList(LessonId));
            boolean b = labelService.remove(wrapper);
            if (b){
                return Result.build(ConstantEnum.SUCCESS);
            }
            return Result.build(ConstantEnum.ERROR);
        }
        return Result.build(ConstantEnum.NULL_DATA_PARAMETER);

    }



    @PostMapping
    @ApiOperation("课程标签关联根据课程id数组查询")
    @ApiImplicitParam(value = "课程id数组", name = "LessonId", required = true, paramType = "query")
    public Result<ConstantEnum> findByLessonId(@RequestParam("LessonId")Long[] LessonId){
        if(Objects.nonNull(LessonId)){
            LambdaQueryWrapper<TbLessonLabel> wrapper = Wrappers.<TbLessonLabel>lambdaQuery().in(TbLessonLabel::getLessonId,Arrays.<Long>asList(LessonId));
            List<TbLessonLabel> list = labelService.list(wrapper);
            if(list.size() > 0){
                // 返回查询结果
                return Result.build(ConstantEnum.SUCCESS).setResult(list);
            }
            // 查询数据为空
            return Result.build(ConstantEnum.NULL_DATA);

        }
        // 参数为空
        return Result.build(ConstantEnum.NULL_DATA_PARAMETER);

    }

}
